<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>09_Vue实例_生命周期</title>
  </head>
  <body>
    <!--
1. vue对象的生命周期
  1). 初始化显示
    * beforeCreate()
    * created()
    * beforeMount()
    * mounted()
  2). 更新状态
    * beforeUpdate()
    * updated()
  3). 销毁vue实例: vm.$destory()
    * beforeDestory()
    * destoryed()
2. 常用的生命周期方法
  created()/mounted(): 发送ajax请求, 启动定时器等异步任务
  beforeDestory(): 做收尾工作, 如: 清除定时器
-->

    <div id="root">
      <p>{{num}}</p>
      <button @click="num++">按钮</button>
      <button @click="destroy">卸载</button>
    </div>

    <script type="text/javascript" src="../js/vue.js"></script>
    <script type="text/javascript">
      new Vue({
        el: "#root",
        data: {
          num: 0,
        },
        methods: {
          destroy() {
            this.$destroy();
          },
        },
        // 初始化/挂载阶段
        beforeCreate() {
          // 再数据代理之前触发的，所以此时不会通过this直接访问data/methods/computed数据
          console.log("beforeCreate");
          console.log(this.num);
        },
        /* 
          面试题：请求为什么在mounted中发送，而不在created？
            created优势：
              触发时机快，请求速度快，渲染速度快
            created缺点：
              因为在created做了一些事件，所以后面初始化流程慢一点，让初始化页面渲染速度慢了一点
            mounted优势：
              可以操作DOM
              触发时机慢，不会影响初始化渲染
            mounted缺点：  
              触发时机慢，所以请求速度慢  
        */
        created() {
          console.log("created");
          console.log(this.num);
        },
        beforeMount() {
          console.log("beforeMount");
          console.log(this.num);
        },
        // 在挂载之后触发：此时DOM才渲染完成/加载完成
        mounted() {
          // 发送ajax请求，设置定时器，绑定事件等一次性任务
          console.log("mounted");
          console.log(this.num);
        },
        // 更新阶段
        beforeUpdate() {
          console.log("beforeUpdate");
          console.log(this.num);
        },
        updated() {
          console.log("updated");
          console.log(this.num);
        },
        // 卸载阶段
        // 收尾工作：清除定时器，解绑事件
        // 防止内存泄漏
        beforeDestroy() {
          // 收尾工作
          console.log("beforeDestroy");
        },
        destroyed() {
          console.log("destroyed");
        },
      });
    </script>
  </body>
</html>
